热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

子树|损失_55决策树的剪枝算法

篇首语:本文由编程笔记#小编为大家整理,主要介绍了5-5决策树的剪枝算法相关的知识,希望对你有一定的参考价值。树的剪枝算法输入:

篇首语:本文由编程笔记#小编为大家整理,主要介绍了5-5 决策树的剪枝算法相关的知识,希望对你有一定的参考价值。



树的剪枝算法

输入:
ID3或C4.5的决策树
参数a
输出:
剪枝后的决策树





T


a




T_a


Ta


递归版本


  1. 从树的根结点开始
  2. 如果该结点的孩子中存在子树(不全是叶子结点),则先对子树做prune
  3. 所有子树都prune之后,再判断该结点的孩子是否都是叶子
  4. 如果不全是叶子,对该结点的算法结束
  5. 如果该结点的孩子都是叶子,则尝试对该结点剪枝
    5.a 计算





    C


    a



    (



    T


    B



    )



    C_a(T_B)


    Ca(TB)
    ,代表该结点split后以该结点为根结点的子树的损失,其损失的计算方式与整棵树的计算方式相同






    C


    a



    (



    T


    B



    )


    =










    T








    N


    t




    H


    t



    (


    T


    )


    +


    a





    T






    C_a(T_B) = \\sum^|T|N_tH_t(T) + a|T|


    Ca(TB)=TNtHt(T)+aT

    因此在生成树的时候为每个叶子结点保存它的





    N


    t




    N_t


    Nt






    H


    t




    H_t


    Ht

    5.b 计算





    C


    a



    (



    T


    A



    )



    C_a(T_A)


    Ca(TA)
    ,代表该结点split之前作为一个叶子结点时的熵。因此在生成树时记录该split之前的熵
    5.c 比较





    C


    a



    (



    T


    B



    )



    C_a(T_B)


    Ca(TB)






    C


    a



    (



    T


    A



    )



    C_a(T_A)


    Ca(TA)
    ,如果





    C


    a



    (



    T


    A



    )






    C


    a



    (



    T


    B



    )



    C_a(T_A)\\le C_a(T_B)


    Ca(TA)Ca(TB)
    ,则将该结点修改为叶子结点。即:计算该结点的输出标记,并删除它的所有孩子结点。
  6. 对该结点的处理结束,由于这个算法是递归调用的,如果该结点有父结点,则要继续处理它的父结点。

def isTree(Node):
return 'child' in Node.keys()
def Clip(Node):
bestNt = 0
for value in Node['child']:
if Node['child'][value]['Nt'] > bestNt:
bestNt = Node['child'][value]['Nt']
bestLabel = Node['child'][value]['label']
Node['label'] = bestLabel
Node.pop('child')

def Merge(Node, alpha):
# 计算CaTb
CT_b = 0
for value in Node['child']:
CT_b = CT_b + Node['child'][value]['Nt'] * Node['child'][value]['entropy'] + alpha
# 计算CaTa
CT_a = Node['entropy'] + alpha
# 剪枝的条件
if CT_a <&#61; CT_b:
Clip(Node)

def prune(Node, alpha):
# 判断子结点中是否存在树
for value in Node[&#39;child&#39;]:
# 如果存在树
if isTree(Node[&#39;child&#39;][value]):
# 先对树子结点做prune
prune(Node[&#39;child&#39;][value], alpha)
# 对所有子树都prune之后&#xff0c;判断是否所有子树都是叶子
isAllLeaf &#61; True
for value in Node[&#39;child&#39;]:
if isTree(Node[&#39;child&#39;][value]):
isAllLeaf &#61; False
break
# 如果所有子树都是叶子
if isAllLeaf:
# 尝试对结点做剪枝
Merge(Node, alpha)

DP版本

【&#xff1f;】如何通过DP实现


推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Basic微分方程Whatis形如\(F(x,y,y',,y^{(n)})0\)求\(yf(x,y)\)阶:方程中导数的最高阶数解:yy(x)通解:\(yy(x,C ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • Python 开发笔记:深入探讨字符串及其常用方法与技巧 ... [详细]
  • 本文以 www.域名.com 为例,详细介绍如何为每个注册用户提供独立的二级域名,如 abc.域名.com。实现这一功能的核心步骤包括:首先,确保域名支持泛解析,即将 A 记录设置为 *.域名.com,以便将所有二级域名请求指向同一服务器。接着,在服务器端使用 ASP.NET 2.0 进行配置,通过解析 HTTP 请求中的主机头信息,动态识别并处理不同的二级域名,从而实现个性化内容展示。此外,还需在数据库中维护用户与二级域名的对应关系,确保每个用户的二级域名都能正确映射到其专属内容。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
author-avatar
粉笔画1995_996
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有